package com.sjqi.demo.sqlsource;

import com.sjqi.demo.config.BoundSql;
import com.sjqi.demo.config.DynamicContext;
import com.sjqi.demo.parser.SqlSourceParser;
import com.sjqi.demo.sqlnode.SqlNode;

/**
 * @author qishaojun
 * 封装了${} 和动态标签的SqlNode 信息
 * //TODO: 既包含#{} 和${} 的需要本类处理
 */
public class DynamicSqlSource implements SqlSource {
    private SqlNode mixedSqlNode;

    public DynamicSqlSource(SqlNode mixedSqlNode) {
        this.mixedSqlNode = mixedSqlNode;
    }

    @Override
    public BoundSql getBoundSql(Object param) {
        // 1.处理所有的SQL节点，获取合并之后的完整的SQL语句（可能还带有#{}）
        DynamicContext context = new DynamicContext(param);
        mixedSqlNode.apply(context);
        String sqlText = context.getSql();
        // 2.调用SqlSource的处理逻辑，对于#{}进行处理
        // 处理#{}
        SqlSourceParser parser = new SqlSourceParser();
        SqlSource staticSqlSource = parser.parse(sqlText);

        return staticSqlSource.getBoundSql(param);
    }
}
